iT邦幫忙

2024 iThome 鐵人賽

DAY 27
0

經過了那麼多天,大致上整個開源套件的基本功能都有了,今天就來讓我們的套件內容更豐富。會多新增專門搜尋投手跟打者的 statcast_pitcher_searchstatcast_batter_search 跟搜尋小聯盟 Statcast 資料的 minor_statcast_search

投手搜尋

這兩個 function 的實作其實不難,會運用到我們之前在 Day 18 - 用 requests 取得 Raw Data 後使用 pandas 轉成 DataFrame 寫的 statcast_search。基本上後面的 Statcast function 都會是這個 function 的延伸。

不一樣的地方是,因為想要是給專門搜尋投手的功能,我們就需要把 player_type 限制成只會是 "pitcher",然後會需要檢查 pitchers_lookup 一定要給值才能執行。剩下的參數就直接傳入給 statcast_search 讓他來處理就好,所以我們前面可以寫成:

def statcast_pitcher_search(pitchers_lookup: str | list[str],
                            season: str | list[str] = "2024",
                            game_type: str | GameType | list[str | GameType] = GameType.REGULAR_SEASON,
                            start_dt: str = "", end_dt: str = "",
                            month: str | Month | list[str | Month] = "",
                            opponent: str | MlbTeam | list[str | MlbTeam] = "") -> pd.DataFrame:

    if not pitchers_lookup:
        raise ValueError("pitchers_lookup is required")
        
    params = {
        "pitchers_lookup": pitchers_lookup,
        "season": season,
        "player_type": "pitcher",
        "game_type": game_type,
        "start_dt": start_dt,
        "end_dt": end_dt,
        "month": month,
        "opponent": opponent
    }
    
    return statcast_search(**params)

這樣其實大概的投手搜尋功能就完成了,因為都給 statcast_search 處理的關係,我們也不用特別寫 Utils 去處理使用者傳入的參數。

pitchers_lookup
另外一個想特別提到的是,關於 pitchers_lookup,他是可以傳入 list 的,像是如果我們想同時搜尋 山本由伸達比修有 的話,可以傳入 ["808967", "506433"](分別為他們的 MlbID),不過這次我們不需要像 Month 等多選一樣使用 join 處理,原因是如果我們 requests 在傳入 params 的參數,如果是 list 的話,URL 會變成 pitchers_lookup[]=808967&pitchers_lookup[]=506433 兩個,而這也是 Savant API 目前可以接受的格式。我有試過像是 pitchers_lookup[]=808967,506433pitchers_lookup[]=808967|506433 都會造成搜尋不到結果。

功能都完成後記得加上前面介紹的 Docstring 讓之後的開發者跟使用者更了解這個 function。

打者搜尋

打者搜尋其實跟前面介紹的投手搜尋差不多,基本上就是把 pitchers 改成 batters 就好了,這樣就能建一個 statcast_batter_search。像是這樣兩個長很像的 functions,有時候我們會把重複的部份抽出來,然後統一寫成一個 function 然後可能用傳入的 player_type 來決定要使用 pitcherbatter,這樣可以減少一些重複的程式碼,不過 function 的命名就會不太一樣,可能沒有那麼好懂。不過為了可讀性可能也會變成需要改動的時候要改不同的地方,簡單來說其實選擇哪種方式都會有取捨,可以根據當下的需求決定要用哪種方式。

Minor Statcast Search

接下來是可以拿到小聯盟 Statcast 資料的 function,他跟 statcast_search 不一樣的是他會用另外一個 API URL,來取得資料,另外要取得 Statcast 資料就要多加 chk_tracked_pitch=onminor=true,但總的來說也是多加幾個參數傳入,跟 statcast_search 差不多。不過有一些 Enums 可能不能延續用,因為小聯盟會有些參數會有限制,像是 game_type 就會只有例行賽跟季後賽,可查詢的賽季也只有 2021 到 最新一季。還有幾個不一樣的地方,像是可以使用 level 去篩選是 A 還是 AAA,以及所屬球隊的 hfTeamAffiliate 來篩選,畢竟多數人對小聯盟球隊的名稱沒那麼熟悉。等 minor_statcast_search 完成,也能一起連投打搜尋也一起完成,這樣我們的套件又更完整了。

本日小結

今天主要是來介紹套件可以擴充哪些新功能,明天的話可能會來看我們這些 Functions 能不能再讓他們的 Performance 提升。
今天就到這邊,最後一樣謝謝大家耐心地看完,如果有任何問題與建議,歡迎留言告訴我,明天見,掰掰。


上一篇
Day 26 - 撰寫 CONTRIBUTING.md 與設定 Templates
下一篇
Day 28 - 簡單使用 timeit 測試程式執行時間與 requests.Session() 增加效能
系列文
上次介紹的棒球套件很少更新了,那就只好自己寫一個!?31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言